package com.ldk.controller;

import com.ldk.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
public class TestController {
    //客户端向服务端传参 服务器如何接收参数
    /*
    在浏览器地址栏使用路径传参
    http://localhost:8060/t1?name='lisi'&age=20
    */
    @RequestMapping("t1")
    public void test1(String name, String age) {
        System.out.println(name);
        System.out.println(age);
    }

    /*
    使用HttpServletRequest 请求对象来获取参数
    使用HttpServletRequest和HttpServletResponse 需要导入jar包。
    */
    @RequestMapping("t2")
    public void test2(HttpServletRequest request) {
        String username = request.getParameter("name");
        String age = request.getParameter("age");
        System.out.println(username);
        System.out.println(age);
    }

    //当在浏览器输入http://localhost:8060/toLoginPage，
    //跳转到一个login.jsp
    @RequestMapping("/toLoginPage")
    public String toLoginPage() {
        return "login";
    }

    //表单传参 使用表单的name属性值 作为参数传到服务端
    //服务端的参数名和表单的name属性一致即可
    /*
    浏览器传入到服务器的参数都是String类型的
    但是对于数字类型的字符串，在服务端可以使用Integer来接收。
    因为SpringMVC框架自动完成类型转换
    */
    /*@RequestMapping("/doLogin")
    public void doLogin(String username,String pwd){
        System.out.println(username);
        System.out.println(pwd);
    }*/

    @RequestMapping("/doLogin")
    public void doLogin(HttpServletRequest request) {
        String username = request.getParameter("username");
        String pwd = request.getParameter("pwd");
        System.out.println(username + ";" + pwd);
    }

    //表单封装实体对象 向服务端传参/*
    /*
    当表单的name 属性值与实体类的属性一致的时候，
    SpringMVC会将表单数据自动封装到实体类中，那么，可以在服务端直接传入对象即可
    */
    //当在浏览器输入localhost:8060/toRegPage-->register.jsp
    @RequestMapping("toRegPage")
    public String toRegPage() {
        //return "redirect:register" 重定向
        return "register";//默认是转发
    }

    //接收doReg请求
    @RequestMapping("/doReg")
    public void doReg(User user) {
        System.out.println(user.toString());
    }

    //跳转到t1.jsp
    @RequestMapping("/tot1")
    public String toT1Page() {
        return "t1";
    }

    //接收toOrderData 请求
    @RequestMapping("toOrderData")
    public String toOrderData(String name, Model model) {
        //目的 将name值绑定到t2.jsp页面
        //使用Model对象绑定数据
        model.addAttribute("username", name);
        return "t2";
    }

    //使用HttpServletRequest 对象绑定数据
    @RequestMapping("/t3")
    public String t3(HttpServletRequest request) {
        request.setAttribute("username", "xxc");
        request.setAttribute("salry", 8000);
        request.setAttribute("name", "肖显超");
        return "t2";
    }

    //使用ModelAndView
    @RequestMapping("/t4")
    public ModelAndView t4(ModelAndView modelAndView) {
        //ModelAndView绑定数据
        modelAndView.addObject("age", 100);
        //ModelAndView绑定视图
        modelAndView.setViewName("t2");
        return modelAndView;
    }

    //使用HttpSession对象绑定数据
    @RequestMapping("/t5")
    public String t5(HttpSession session) {
        //使用session绑定数据
        session.setAttribute("address", "湛江市");
        return "t2";
    }

    //ServletContext
    @RequestMapping("/t6")
    public String t6(HttpServletRequest request) {
        //使用request获取ServletContext
        ServletContext context = request.getServletContext();
        //使用ServletContext绑定数据
        context.setAttribute("tel", 123);
        return "t2";
    }

    //使用HttpServletResponse 响应对象
    @RequestMapping("/t7")
    public void t7(HttpServletResponse response) throws IOException {
        //告诉浏览器输出内容
        response.setContentType("text/html;charset=utf-8");
        //通过HttpServletResponse获取输出流
        PrintWriter writer = response.getWriter();
        //使用PrintWriter 写出内容
        writer.println("服务器正忙，请稍后重试");
        writer.close();
    }

    //将对象转成JSON字符串
    @RequestMapping("/t8")
    @ResponseBody  //将方法返回的数据转成JSON字符串
    public User t8(){
        User user = new User();
        //将数据封装到User对象中
        user.setUsername("李四");
        user.setTel("1235896");
        user.setPwd("123456");
        //最终返回的JSON串的格式
        //"{"username":"李四","tel":"123454456","pwd":"123456"}"
        return user;
    }

    @RequestMapping("/t9")
    @ResponseBody
    public String t9(){
        String name="王五";
        return name;
    }

    @RequestMapping("/t10")
    @ResponseBody
    public List<User> t10() {
        List<User> list = new ArrayList<>();
        User user1 = new User();
        user1.setUsername("肖");
        user1.setPwd("146656565");
        user1.setTel("54654654");
        list.add(user1);

        User user2 = new User();
        user2.setUsername("肖xxx");
        user2.setPwd("14665654565");
        user2.setTel("546546454554");
        list.add(user2);
        return list;
    }
        //将Map集合转成JSON字符串
        @RequestMapping("/t11")
        @ResponseBody
        public Map<String,Object> t11(){
            Map<String,Object> map = new HashMap<>();
            //向map集合添加数据
            map.put("state",200);
            map.put("msg","手机验证码已经发生");
            return map;
    }

    @RequestMapping("/t12")
    @ResponseBody
    public String t12(Model model){
        String str=null;
        String s =str.toString();
        model.addAttribute("email","1669151379@qq.com");
        return "t2";

    }

    /*//写一个方法用来处理Controller发生的异常
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Map<String,Object> doException(){
        Map<String,Object> map = new HashMap<>();

        map.put("state",500);
        map.put("msg","服务器正忙，请稍后尝试");
        return map;
    }*/
}
